home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / comms / non-internet / samba / source / getsmbpass.c < prev    next >
C/C++ Source or Header  |  1996-06-26  |  4KB  |  167 lines

  1. /* Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of the
  7. License, or (at your option) any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with the GNU C Library; see the file COPYING.LIB.  If
  16. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  17. Cambridge, MA 02139, USA.  */
  18.  
  19. /* Modified to use with samba by Jeremy Allison, 8th July 1995. */
  20.  
  21. #include "includes.h"
  22.  
  23. #ifdef REPLACE_GETPASS
  24.  
  25. #ifdef SYSV_TERMIO 
  26.  
  27. /* SYSTEM V TERMIO HANDLING */
  28.  
  29. static struct termio t;
  30.  
  31. #define ECHO_IS_ON(t) ((t).c_lflag & ECHO)
  32. #define TURN_ECHO_OFF(t) ((t).c_lflag &= ~ECHO)
  33. #define TURN_ECHO_ON(t) ((t).c_lflag |= ECHO)
  34.  
  35. #ifndef TCSAFLUSH
  36. #define TCSAFLUSH 1
  37. #endif
  38.  
  39. #ifndef TCSANOW
  40. #define TCSANOW 0
  41. #endif
  42.  
  43. int tcgetattr(int fd, struct termio *t)
  44. {
  45.     return ioctl(fd, TCGETA, t);
  46. }
  47.  
  48. int tcsetattr(int fd, int flags, const struct termio *t)
  49. {
  50.     if(flags & TCSAFLUSH)
  51.         ioctl(fd, TCFLSH, TCIOFLUSH);
  52.     return ioctl(fd, TCSETS, t);
  53. }
  54.  
  55. #else /* SYSV_TERMIO */
  56. #ifdef BSD_TERMIO
  57.  
  58. /* BSD TERMIO HANDLING */
  59.  
  60. static struct sgttyb t;  
  61.  
  62. #define ECHO_IS_ON(t) ((t).sg_flags & ECHO)
  63. #define TURN_ECHO_OFF(t) ((t).sg_flags &= ~ECHO)
  64. #define TURN_ECHO_ON(t) ((t).sg_flags |= ECHO)
  65.  
  66. #ifndef TCSAFLUSH
  67. #define TCSAFLUSH 1
  68. #endif
  69.  
  70. #ifndef TCSANOW
  71. #define TCSANOW 0
  72. #endif
  73.  
  74. int tcgetattr(int fd, struct sgttyb *t)
  75. {
  76.     return ioctl(fd, TIOCGETP, (char *)t);
  77. }
  78.  
  79. int tcsetattr(int fd, int flags, const struct sgttyb *t)
  80. {
  81.     return ioctl(fd, TIOCSETP, (char *)t);
  82. }
  83.  
  84. #else /* BSD_TERMIO */
  85.  
  86. /* POSIX TERMIO HANDLING */
  87. #define ECHO_IS_ON(t) ((t).c_lflag & ECHO)
  88. #define TURN_ECHO_OFF(t) ((t).c_lflag &= ~ECHO)
  89. #define TURN_ECHO_ON(t) ((t).c_lflag |= ECHO)
  90.  
  91. static struct termios t;
  92. #endif /* BSD_TERMIO */
  93. #endif /* SYSV_TERMIO */
  94.  
  95. char *
  96. getsmbpass(char *prompt)     
  97. {
  98.   FILE *in, *out;
  99.   int echo_off;
  100.   static char buf[256];
  101.   static size_t bufsize = sizeof(buf);
  102.   size_t nread;
  103.  
  104.   /* Catch problematic signals */
  105.   signal(SIGINT, SIGNAL_CAST SIG_IGN);
  106.  
  107.   /* Try to write to and read from the terminal if we can.
  108.      If we can't open the terminal, use stderr and stdin.  */
  109.  
  110.   in = fopen ("/dev/tty", "w+");
  111.   if (in == NULL)
  112.     {
  113.       in = stdin;
  114.       out = stderr;
  115.     }
  116.   else
  117.     out = in;
  118.  
  119.   setvbuf(in, NULL, _IONBF, 0);
  120.  
  121.   /* Turn echoing off if it is on now.  */
  122.  
  123.   if (tcgetattr (fileno (in), &t) == 0)
  124.     {
  125.       if (ECHO_IS_ON(t))
  126.     {
  127.         TURN_ECHO_OFF(t);
  128.         echo_off = tcsetattr (fileno (in), TCSAFLUSH, &t) == 0;
  129.         TURN_ECHO_ON(t);
  130.     }
  131.       else
  132.     echo_off = 0;
  133.     }
  134.   else
  135.     echo_off = 0;
  136.  
  137.   /* Write the prompt.  */
  138.   fputs (prompt, out);
  139.   fflush (out);
  140.  
  141.   /* Read the password.  */
  142.   buf[0] = 0;
  143.   fgets(buf, bufsize, in);
  144.   nread = strlen(buf);
  145.   if (buf[nread - 1] == '\n')
  146.     buf[nread - 1] = '\0';
  147.  
  148.   /* Restore echoing.  */
  149.   if (echo_off)
  150.     (void) tcsetattr (fileno (in), TCSANOW, &t);
  151.  
  152.   if (in != stdin)
  153.     /* We opened the terminal; now close it.  */
  154.     fclose (in);
  155.  
  156.   /* Catch problematic signals */
  157.   signal(SIGINT, SIGNAL_CAST SIG_DFL);
  158.  
  159.   printf("\n");
  160.   return buf;
  161. }
  162.  
  163. #else
  164.  
  165. void getsmbpasswd_dummy() {;}
  166. #endif
  167.